package com.jessechanrui.template.flowable.flowabletemplate.service.impl;

import com.jessechanrui.template.flowable.flowabletemplate.service.FlowableService;
import jakarta.annotation.Resource;
import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author chenrui
 * @version 1.0
 * @description FlowableServiceImpl
 * @date 2025/8/5
 */
@Service
public class FlowableServiceImpl implements FlowableService {

    // 注入Flowable核心服务
    @Resource
    private RepositoryService repositoryService;  // 流程定义管理
    @Resource
    private RuntimeService runtimeService;        // 流程实例管理
    @Resource
    private TaskService taskService;              // 任务管理

    /**
     * 部署流程（Flowable会自动部署processes目录下的文件，这里演示手动部署）
     */
    @Override
    @Transactional
    public String deployProcess() {
        Deployment deployment = repositoryService.createDeployment()
                .name("简单流程部署")
                .addClasspathResource("processes/simple-process.bpmn20.xml")
                .deploy();
        return "流程部署成功，部署ID：" + deployment.getId();
    }

    /**
     * 启动流程实例
     * @param applicant 申请人（动态指定第一个任务的处理人）
     */
    @Override
    @Transactional
    public String startProcess(String applicant) {
        // 流程参数（与BPMN中的${applicant}对应）
        Map<String, Object> variables = new HashMap<>();
        variables.put("applicant", applicant);

        // 启动流程实例（通过流程定义ID或Key）
        ProcessInstance instance = runtimeService.startProcessInstanceByKey("simpleProcess", variables);
        return "流程实例启动成功，实例ID：" + instance.getId() + "，当前任务：提交申请";
    }

    /**
     * 查询用户的待办任务
     * @param assignee 处理人（如申请人ID或"manager"）
     */
    @Override
    @Transactional
    public List<Task> getTodoTasks(String assignee) {
        List<Task> tasks = taskService.createTaskQuery()
                .taskAssignee(assignee)
                .orderByTaskCreateTime().desc()
                .list();
        tasks.forEach(task -> System.out.println(task.getTaskLocalVariables() + ":" + task));
        return tasks;
    }

    /**
     * 完成任务
     * @param taskId 任务ID
     */
    @Override
    @Transactional
    public String completeTask(String taskId) {
        taskService.complete(taskId);  // 完成任务，自动流转到下一节点
        return "任务ID：" + taskId + " 已完成";
    }

}
